package chapter11;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * 在Swing事件处理的过程中，主要涉及到三类对象：
 * ●  事件源（Event Source）：事件发生的场所，通常是产生事件的组件，如窗口、按钮、菜单等。
 * ●  事件对象（Event）：封装了GUI组件上发生的特定事件（通常就是用户的一次操作）。
 * ●  监听器（Listener）：负责监听事件源上发生的事件，并对各种事件做出相应处理（监听器对象中包含事件处理器）。
 *
 * 实现Swing事件处理的主要步骤如下：
 * （1）创建事件源：除了一些常见的按钮、键盘等组件可以作为事件源外，还可以使用JFrame窗口在内的顶级容器作为事件源。
 * （2）自定义事件监听器：根据要监听的事件源创建指定类型的监听器进行事件处理。监听器是一个特殊的Java类，必须实现XxxListener接口。根据组件触发的动作进行区分，例如，WindowListener用于监听窗口事件，ActionListener用于监听动作事件。
 * （3）为事件源注册监听器：使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听事件后，就会触发绑定的事件监听器，由监听器中的方法对事件进行相应处理。
 */

// 2. 自定义事件监听器类
class MyListener implements ActionListener {
    // 实现监听器方法，对监听事件进行处理
    public void actionPerformed(ActionEvent e) {
        System.out.println("用户点击了JButton按钮组件");
    }
}

public class Example07 {
    private static void createAndShowGUI() {
        JFrame f = new JFrame("JFrame窗口");
        f.setSize(200, 100);
        // 1. 创建一个按钮组件，作为事件源
        JButton btn = new JButton("按钮");
        // 3. 为按钮组件事件源添加自定义监听器
        btn.addActionListener(new MyListener());
        f.add(btn);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        // 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
        SwingUtilities.invokeLater(Example07::createAndShowGUI);
    }
}
